

# 1 练习1：查找指定文件
# 已知条件：想查找的文件名已知道，但目录在哪里不知道
# 实现方法：利用glob从最上级目录开始查找，利用递归模式，不断查找，直到找到文件为止

# 获取当前路径下所有内容
# 判断每个内容的类型（文件夹还是文件）
# 递归

import glob
import hashlib
import shutil

path = glob.os.path.join(glob.os.getcwd(),'*')

# print(glob.glob(path))

final_result = []
# 查找指定文件
def search(path,target):
    result = glob.glob(path)

    for data in result:
        # 判断是否是文件夹  如果是 需要递归
        if glob.os.path.isdir(data):
            _path = glob.os.path.join(data,'*')
            search(_path,target)
        else:
            if target in data:
                final_result.append(data)
    return final_result

# /home/test1.py   if test1 in /test1/abc.py


# 2. 查找含有指定内容的文件
# 已知条件：文件中包含某些关键字，但不知道文件名和所在路径
# 实现方法：利用glob从最上级目录开始查找，利用递归模式，如果是文件夹则进入继续查找，是文件则读取，判断是否包含该内容，返回含有该内容的文件名以及所在路径

# 获取当前路径下所有内容
# 判断每个内容的类型（文件夹还是文件）
# 递归

# 查找含有指定内容的文件
def search1(path,target):
    result = glob.glob(path)

    for data in result:
        if glob.os.path.isdir(data):
            _path = glob.os.path.join(data,'*')
            print('path is %s' % _path)
            search(_path,target)
        else:
            f = open(data,'r')
            try:
                content = f.read()
                if target in content:
                    final_result.append(data)
            except:
                print('data read failed:%s' % data)
                continue
            finally:
                f.close()
    return final_result



# 3. 练习3：清理重复的文件
# 已知条件:基本一切都不知道
# 实现方法:可以从指定路径(或最上层路径)开始读取,利用glob读取每个文件夹,读到文件,记录名称和大小,每次都检测之前是否读取过相同名称的文件,如果存在,判断大小是否相同,如果相同,我们认为是重复文件,则删除
data = {}
#data = {'name': {'path/name': 'content', 'path2/name': 'content'}}
def clear(path):
    result = glob.glob(path)

    for _data in result:
        if glob.os.path.isdir(_data):
            _path = glob.os.path.join(_data,'*')
            clear(_path)
        else:
            # glob.os.path.split("D:\\freedong\\zhuzhu\\FullStackEngineer2025\\python_all_round\\file1.txt")
            # ('D:\\freedong\\zhuzhu\\FullStackEngineer2025\\python_all_round', 'file1.txt')
            name = glob.os.path.split(_data)[-1]

            is_byte = False
            if 'zip' in name:
                is_byte = True
                f = open(_data,'rb')
            else:
                f = open(_data,'r',encoding='utf-8')
            content = f.read()
            f.close()

            if is_byte:
                hash_content_obj = hashlib.md5(content)
            else:
                hash_content_obj = hashlib.md5(content.encode('utf-8'))
            hash_content = hash_content_obj.hexdigest()

            if name in data:
                sub_data = data[name]

                is_detele = False

                for k,v in sub_data.items():
                    if v == hash_content:
                        glob.os.remove(_data)
                        print('%s will delete' % _data)
                        is_detele = True

                if not is_detele:
                    data[name][_data] = hash_content



            else:
                data[name] = {
                    _data:hash_content
                }


# 4. 练习4：批量修改目录中的文件名称
# 已知条件：直到文件名需要修改的指定字符串
# 实现方法：通过循环，将目标字符串加入到文件名并进行修改

# 批量修改目录中的文件名称
def update_name(path):
    result = glob.glob(path)

    for index,data in enumerate(result):
        if glob.os.path.isdir(data):
            _path = glob.os.path.join(data,'*')
            update_name(_path)
        else:
            path_list = glob.os.path.split(data)
            name = path_list[-1]
            new_name = '%s_%s' % (index,name)
            new_data = glob.os.path.join(path_list[0],new_name)
            shutil.move(data,new_data)


if __name__ == '__main__':
    # result = search(path,target='test1')
    # result = search1(path,target='dfsdf')
    # result = clear(path)
    # print(data)
    # for k,v in data.items():
    #     for _k,v in v.items():
    #         print(_k,v)
    path = glob.os.path.join(glob.os.getcwd(),'test/*')
    update_name(path)
